package com.supercube.wechat.dao;

// import com.supercube.crm.vo.CourseVO;
// import com.supercube.crm.vo.GoodsVO;
import com.supercube.sport.yoga.domain.MemberCardBindingInfoDTO;
import com.supercube.sport.yoga.vo.MemberCardBasicInfoVO;
import com.supercube.wechat.domain.*;
import com.supercube.wechat.response.AppointmentClassVO;
import com.supercube.wechat.response.ClassInfoVO;
import com.supercube.wechat.response.RecommendCourseVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 小程序ApiDao
 *
 * @author djzhao
 * @date 19/11/03 10:30
 * @email djzhao627@gmail.com
 */
public interface MiniAppApiDao {

    // ===============用户信息相关===============

    /**
     * 通过OpenID获取微信用户信息
     *
     * @param openId 小程序返回的openID
     * @return 微信用户对象
     */
    WeChatUserInfo getUserInfoWithOpenId(String openId);

    /**
     * 使用微信进行注册(插入用户表)
     *
     * @param userInfo 用户信息
     * @return 成功数
     */
    int insertMember(WeChatUserInfo userInfo);

    /**
     * 使用微信进行注册(插入小程序表)
     *
     * @param userInfo 用户信息
     * @return 成功数
     */
    int insertWeChatUser(WeChatUserInfo userInfo);


    // ===============首页相关===============

    /**
     * 获取小程序首页轮播图
     *
     * @return 轮播图列表
     */
    List<SlideImageDO> getHomeSlideImage();

    /**
     * 获取首页的通知
     *
     * @param num 需要获取的数量
     * @return 通知的列表
     */
    List<NotificationDO> getHomeNotification(int num);

    /**
     * 获取首页的推荐课程列表
     *
     * @param type 推荐类型：0精选热门课程；1名师进修课程；2热门推荐课程
     * @return 推荐课程列表
     */
    List<RecommendCourseVO> getRecommendCourse(int type);

    // ===============自定义页面相关===============

    /**
     * 根据页面ID获取自定义页面
     *
     * @param id 页面ID
     * @return 自定义页面对象
     */
    CustomPageDO getCustomPageById(int id);


    // ===============商品相关===============

    /**
     * 根据ID获取商品详情
     *
     * @param id 商品ID
     * @return 商品详情
     */
    // List<GoodsVO> getProductDetail(Integer id);

    /**
     * 获取门店列表
     *
     * @return
     */
    List<ShopsDO> getShops();


    // ===============约课相关===============

    /**
     * 获取可约课列表
     *
     * @param date 日期
     * @return
     */
    List<AppointmentClassVO> getAppointmentCourseListByDate(String date);

    /**
     * 通过课程ID获取课程详情
     *
     * @param courseId 课程ID
     * @return
     */
    // CourseVO getCourseDetailById(int courseId);

    /**
     * 是否已经预约过了
     *
     * @param courseId 课程ID
     * @param memberId 会员ID
     * @return
     */
    Integer isAlreadyAppointment(@Param("courseId") int courseId, @Param("memberId") int memberId);

    /**
     * 提交预约
     *
     * @param curriculumId 课程ID
     * @param memberId 会员ID
     * @return
     */
    boolean submitAppointment(@Param("curriculumId") int curriculumId, @Param("memberId") int memberId);

    /**
     * 根据会员ID获取已约课列表
     *
     * @param memberId 会员ID
     * @param date     日期
     * @return
     */
    List<ClassInfoVO> getAlreadyAppointmentCourseListByMemberId(@Param("memberId") String memberId, @Param("date") String date);

    /**
     * 根据会员ID获取已约课历史
     *
     * @param memberId 会员ID
     * @return
     */
    List<ClassInfoVO> getAppointmentCourseHistoryByMemberId(@Param("memberId") String memberId);

    /**
     * 取消预约
     *
     * @param id 预约ID
     * @return
     */
    int cancelAppointment(String id);

    /**
     * 获取会员卡列表
     * @param memberId 会员ID
     * @return 会员卡列表
     */
    List<MemberCardBasicInfoVO> getVipCards(String memberId);

    /**
     * 获取会员可以预约的课程列表
     * @param memberId 会员ID
     * @param date 日期
     * @return 课程列表
     */
    List<ClassInfoVO> getClassList(@Param("memberId") String memberId, @Param("date") String date);

}
